package com.closer.service.biz.ai.tools;

import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONObject;
import com.closer.service.support.constant.AppConstant;
import dev.langchain4j.agent.tool.P;
import dev.langchain4j.agent.tool.Tool;
import dev.langchain4j.agent.tool.ToolMemoryId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

/**
 * 文件写入工具
 * 支持AI通过工具调用的方式写入文件
 */
@Slf4j
@Component
public class FileWriteTool extends BaseTool {

    @Tool("写入文件到指定路径")
    public String writeFile(
        @P("文件的相对路径")
        String relativeFilePath,
        @P("文件内容")
        String content,
        @ToolMemoryId
        Long appId
    ){
        try{
            var path = Paths.get(relativeFilePath);
            if(!path.isAbsolute()){
                //相对路径处理
                var projectDirName= "vue_project_"+appId;
                var projectRoot = Paths.get(AppConstant.CODE_OUTPUT_ROOT_DIR,projectDirName);
                path = projectRoot.resolve(relativeFilePath);
            }
            //创建父目录（如果不存在）
            var parentDir = path.getParent();
            if(parentDir != null){
                Files.createDirectories(parentDir);
            }
            //写入文件内容
            Files.write(path,content.getBytes(),
                    StandardOpenOption.CREATE,
                    StandardOpenOption.TRUNCATE_EXISTING);
            log.info("成功写入文件：{}",path.toAbsolutePath());
            //注意要返回相对路径，不能反悔绝对路径
            return "文件写入成功："+relativeFilePath;
        }catch (IOException e){
            var errorMessage = "写入文件失败："+relativeFilePath+  ",错误：" + e.getMessage();
            log.error(errorMessage,e);
            return errorMessage;
        }

    }

    @Override
    public String getToolName() {
        return "writeFile";
    }

    @Override
    public String getDisplayName() {
        return "写入文件";
    }

    @Override
    public String generateToolExecutedResult(JSONObject arguments) {
        var relativeFilePath = arguments.getStr("relativeFilePath");
        var suffix = FileUtil.getSuffix(relativeFilePath);
        var content = arguments.getStr("content");
        return String.format("""
                        [工具调用] %s %s
                        ```%s
                        %s
                        ```
                        """, getDisplayName(), relativeFilePath, suffix, content);
    }
}
